﻿using QuanLyThuVien.BLL;
using QuanLyThuVien.DTO;
using QuanLyThuVien.Supporter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace QuanLyThuVien.GUI
{
    public partial class GUIPhieuMuon : DevComponents.DotNetBar.Office2007Form
    {
        private BLLPhieuMuon _bllPhieuMuon;
        private BLLDocGia _bllDocGia;
        private BLLTheLoai _bllTheLoai;
        private BLLTacGia _bllTacGia;
        private BLLCuonSach _bllCuonSach;
        private BLLCT_PhieuMuon _bllCT_PhieuMuon;
        private BLLQuyDinh _bllQuyDinh;

        private DTOPhieuMuon _PhieuMuon;
        private THAOTAC _ThaoTac;

        //----------------------------------------------------------------------
        //Desc: constructor mặc định
        //----------------------------------------------------------------------
        public GUIPhieuMuon()
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = THAOTAC.XEM;
            _PhieuMuon = new DTOPhieuMuon();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 1 tham số
        //----------------------------------------------------------------------
        public GUIPhieuMuon(THAOTAC thaotac)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _PhieuMuon = new DTOPhieuMuon();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 2 tham số
        //----------------------------------------------------------------------
        public GUIPhieuMuon(THAOTAC thaotac, DTOPhieuMuon phieumuon)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _PhieuMuon = phieumuon;
        }

        //----------------------------------------------------------------------
        //Desc: khởi tạo
        //----------------------------------------------------------------------
        public void KhoiTao()
        {
            _bllPhieuMuon = new BLLPhieuMuon();
            _bllDocGia = new BLLDocGia();
            _bllTheLoai = new BLLTheLoai();
            _bllTacGia = new BLLTacGia();
            _bllCuonSach = new BLLCuonSach();
            _bllCT_PhieuMuon = new BLLCT_PhieuMuon();
            _bllQuyDinh = new BLLQuyDinh();
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật giao diện
        //----------------------------------------------------------------------
        public void CapNhatGiaoDien()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    _txtMaDG.ReadOnly = false;
                    _lblMaSach.Visible = true;
                    _txtMaSach.Visible = true;

                    _btnThemMoi.Visible = true;
                    _btnThemDS.Visible = true;
                    _btnLapPhieu.Visible = true;
                    //_btnSua.Visible = false;
                    break;
                case THAOTAC.SUA:
                    _txtMaDG.ReadOnly = true;
                    _lblMaSach.Visible = false;
                    _txtMaSach.Visible = false;

                    _btnThemMoi.Visible = true;
                    _btnThemDS.Visible = false;
                    _btnLapPhieu.Visible = false;
                    //_btnSua.Visible = true;
                    break;
                case THAOTAC.XEM:
                    _txtMaDG.ReadOnly = true;
                    _lblMaSach.Visible = false;
                    _txtMaSach.Visible = false;

                    _btnThemMoi.Visible = false;
                    _btnThemDS.Visible = false;
                    _btnLapPhieu.Visible = false;
                    //_btnSua.Visible = false;
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật nội dung
        //----------------------------------------------------------------------
        public void CapNhatNoiDung()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    this.Text = "LẬP PHIẾU MƯỢN SÁCH";
                    _dtNgayMuon.Value = DateTime.Today;
                    break;
                default:
                    this.Text = "THÔNG TIN PHIẾU MƯỢN SÁCH";
                    HienThiThongTinPhieuMuon();
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị thông tin phiếu mượn
        //----------------------------------------------------------------------
        public void HienThiThongTinPhieuMuon()
        {
            _txtMaDG.Text = _PhieuMuon.DocGia.MaDG;
            _txtHoTen.Text = _PhieuMuon.DocGia.HoTen;
            _dtNgayMuon.Value = _PhieuMuon.NgayMuon;
            BLLCuonSach _bllCuonSach = new BLLCuonSach();

            for (int i = 0; i < _PhieuMuon.DSCTPhieuMuon.Count; i++)
            {
                string macuonsach = _PhieuMuon.DSCTPhieuMuon[i].MaCuonSach;
                string tensach = _bllCuonSach.LayTenDauSach(macuonsach);
                List<DTOTacGia> dstg = _bllCuonSach.LayDSTacGia(macuonsach);
                List<string> dstentg = new List<string>();
                for (int j = 0; j < dstg.Count; j++)
                    dstentg.Add(dstg[j].TenTG);
                string tentl = _bllCuonSach.LayTenTL(macuonsach);
                HienThiLenDataGridView(macuonsach, tensach, dstentg, tentl);
            }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị lên datagridview
        //----------------------------------------------------------------------
        public void HienThiLenDataGridView(string macuonsach, string tensach, List<string> dstentg, string tentl)
        {
            string tentg = dstentg[0];
            if (dstentg.Count > 1)
                for (int i = 1; i < dstentg.Count; i++)
                    tentg += ", " + dstentg[i];
            try
            {
                _dgwDSSach.Rows.Add(macuonsach, tensach, tentg, tentl);
            }
            catch
            { }
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra trùng mã sách
        //----------------------------------------------------------------------
        public bool KiemTraTrungMaSach(string masach)
        {
            for (int i = 0; i < _PhieuMuon.DSCTPhieuMuon.Count; i++)
                if (masach == _PhieuMuon.DSCTPhieuMuon[i].MaCuonSach)
                    return true;
            return false;
        }

        //----------------------------------------------------------------------
        //Desc: lấy dữ liệu
        //----------------------------------------------------------------------
        public DTOCT_PhieuMuon LayDuLieuForm()
        {
            if (_txtMaDG.Text == "")
            {
                MessageBox.Show("Chưa nhập mã độc giả");
                return null;
            }

            if (_txtMaSach.Text == "")
            {
                MessageBox.Show("Chưa nhập mã sách");
                return null;
            }

            if (KiemTraTrungMaSach(_txtMaSach.Text))
            {
                MessageBox.Show("Mã sách đã tồn tại trong sanh sách");
                return null;
            }

            DTOCuonSach cuonsach = _bllCuonSach.LayThongTinCuonSach(_txtMaSach.Text);
            if (cuonsach == null)
            {
                MessageBox.Show("Cuốn sách không tồn tại");
                return null;
            }

            //kiểm tra tình trạng sách
            if (cuonsach.TinhTrang == false)
            {
                MessageBox.Show("Sách đã có người mượn");
                return null;
            }

            string tensach = _bllCuonSach.LayTenDauSach(cuonsach.MaCuonSach);
            if (tensach == null)
            {
                MessageBox.Show("Không lấy được tên sách");
                tensach = "";
            }

            string matl = _bllCuonSach.LayMaTL(cuonsach.MaCuonSach);
            string tentl = "";
            if (matl == null)
                MessageBox.Show("Không lấy được mã thể loại");
            else
            {
                tentl = _bllTheLoai.LayTenTheLoai(matl);
                if (tentl == null)
                {
                    MessageBox.Show("Không lấy được tên thể loại");
                    tentl = "";
                }
            }

            List<DTOTacGia> dstacgia = _bllCuonSach.LayDSTacGia(cuonsach.MaCuonSach);
            List<string> dstentacgia = new List<string>();
            if (dstacgia == null)
                MessageBox.Show("Không lấy được danh sách tác giả");
            else if (dstacgia.Count == 0)
                MessageBox.Show("Sách này chưa có tác giả nào");
            else
            {
                foreach (DTOTacGia tacgia in dstacgia)
                    dstentacgia.Add(tacgia.TenTG);
            }
            HienThiLenDataGridView(cuonsach.MaCuonSach, tensach, dstentacgia, tentl);

            DTOCT_PhieuMuon ctpmu = new DTOCT_PhieuMuon();
            ctpmu.MaCuonSach = cuonsach.MaCuonSach;

            return ctpmu;
        }

        //----------------------------------------------------------------------
        //Desc: xóa thông tin hiển thị
        //----------------------------------------------------------------------
        public void XoaTatCa()
        {
            _PhieuMuon.Reset();
            _txtMaDG.Text = "";
            _txtHoTen.Text = "";
            _txtMaSach.Text = "";
            try
            {
                _dgwDSSach.Rows.Clear();
            }
            catch
            { }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Thoat
        //----------------------------------------------------------------------
        private void _btnThoat_Click(object sender, EventArgs e)
        {
            Close();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện rời textbox MaDG
        //----------------------------------------------------------------------
        private void _txtMaDG_Leave(object sender, EventArgs e)
        {
            if (_ThaoTac != THAOTAC.THEM)
                return;

            if (_txtMaDG.Text != _PhieuMuon.DocGia.MaDG || _PhieuMuon.DocGia.MaDG == "")
            {
                DTODocGia docgia = _bllDocGia.LayThongTinDG(_txtMaDG.Text);
                if (docgia == null)
                {
                    MessageBox.Show("Mã độc giả không tồn tại");
                    _txtMaDG.Text = _PhieuMuon.DocGia.MaDG;
                }
                else
                {
                    _PhieuMuon.DocGia = docgia;
                    _txtHoTen.Text = docgia.HoTen;
                    if (_PhieuMuon.DSCTPhieuMuon != null)
                        _PhieuMuon.DSCTPhieuMuon.Clear();
                    try
                    {
                        _dgwDSSach.Rows.Clear();
                    }
                    catch { }
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button ThemSach
        //----------------------------------------------------------------------
        private void _btnThemSach_Click(object sender, EventArgs e)
        {
            if (_PhieuMuon.DocGia.MaDG != "")
            {
                int sosachmuontd = _bllQuyDinh.LaySoSachMuonTD();
                int sosachdangmuon = _bllPhieuMuon.DemSoSachDangMuon(_PhieuMuon.DocGia.MaDG);
                if (sosachdangmuon >= sosachmuontd)
                {
                    MessageBox.Show("Độc giả đã mượn " + sosachmuontd.ToString() + " sách, không mượn thêm được nữa");
                    return;
                }
                else
                {
                    int sosachmuonmuon = _PhieuMuon.DSCTPhieuMuon.Count;
                    if (sosachmuonmuon >= sosachmuontd - sosachdangmuon)
                    {
                        MessageBox.Show("Độc giả đã mượn " + sosachdangmuon
                            + " sách, chỉ có thể mượn thêm " + (sosachmuontd - sosachdangmuon).ToString() + " sách");
                        return;
                    }
                }
            }
            DTOCT_PhieuMuon ctpmu = LayDuLieuForm();
            if (ctpmu != null)
                _PhieuMuon.DSCTPhieuMuon.Add(ctpmu);
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button LapPhieu
        //----------------------------------------------------------------------
        private void _btnLapPhieu_Click(object sender, EventArgs e)
        {
            if (_PhieuMuon.DSCTPhieuMuon.Count == 0)
            {
                MessageBox.Show("Chưa nhập mã sách nào");
                return;
            }

            _PhieuMuon.NgayMuon = _dtNgayMuon.Value;
            if (_PhieuMuon.DocGia.NgayHetHan < _PhieuMuon.NgayMuon)
            {
                MessageBox.Show("Thẻ độc giả đã hết hạn");
                return;
            }

            if (!_bllPhieuMuon.KiemTraQD(_PhieuMuon))
                return;

            if (!_bllPhieuMuon.TinhNgayHetHan(ref _PhieuMuon))
                return;

            if (!_bllPhieuMuon.PhatSinhMaPhieuMuon(ref _PhieuMuon))
            {
                MessageBox.Show("Không tạo được mã phiếu mượn");
                return;
            }
            else
            {
                for (int i = 0; i < _PhieuMuon.DSCTPhieuMuon.Count; i++)
                    _PhieuMuon.DSCTPhieuMuon[i].MaPhieuMuon = _PhieuMuon.MaPhieuMuon;
            }

            if (_bllPhieuMuon.CapNhat(_PhieuMuon))
            {
                int dem = 0;
                for (int i = 0; i < _PhieuMuon.DSCTPhieuMuon.Count; i++)
                {
                    if (_bllCT_PhieuMuon.CapNhat(_PhieuMuon.DSCTPhieuMuon[i]))
                    {
                        _bllCuonSach.CapNhatTinhTrang(_PhieuMuon.DSCTPhieuMuon[i].MaCuonSach, false);
                        dem++;
                    }
                }
                MessageBox.Show("Lập phiếu mượn thành công");
                _ThaoTac = THAOTAC.SUA;
                CapNhatGiaoDien();
            }
            else
                MessageBox.Show("Lập phiếu mượn thất bại");
            
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện form load
        //----------------------------------------------------------------------
        private void GUIPhieuMuonSach_Load(object sender, EventArgs e)
        {
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button ThemMoi
        //----------------------------------------------------------------------
        private void btnThemMoi_Click(object sender, EventArgs e)
        {
            XoaTatCa();
            _ThaoTac = THAOTAC.THEM;
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện trước khi xóa 1 dòng của data grid view
        //----------------------------------------------------------------------
        private void dgwDSSach_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    string macuonsach = "";
                    try
                    {
                        macuonsach = (string)e.Row.Cells[0].Value;
                    }
                    catch { macuonsach = null; }

                    if (macuonsach != null && macuonsach != "")
                    {
                        DialogResult result = MessageBox.Show("Bạn có muốn xóa cuốn sách "
                            + macuonsach + " khỏi phiếu mượn?", "THÔNG BÁO", MessageBoxButtons.OKCancel);
                        if (result == System.Windows.Forms.DialogResult.OK)
                        {
                            try
                            {
                                _PhieuMuon.DSCTPhieuMuon.RemoveAt(e.Row.Index);
                            }
                            catch { }

                        }
                        else
                            e.Cancel = true;
                    }
                    else
                        e.Cancel = true;

                    break;
                default:
                    e.Cancel = true;
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện key press
        //----------------------------------------------------------------------
        private void txtNhapSo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e != null)
            {
                if (Utils.CheckKeyCode(e.KeyChar))
                    e.Handled = false;
                else
                    e.Handled = true;
            }
        }
    }
}
